graph TD
    A[程序开始] --> B[初始化GLFW]
    B --> C[设置GLFW参数]
    C --> D[创建窗口]
    D --> E{窗口创建成功?}
    E -->|否| F[输出错误信息]
    F --> G[终止GLFW]
    G --> H[返回-1]
    E -->|是| I[设置当前上下文]
    I --> J[初始化GLAD]
    J --> K{GLAD初始化成功?}
    K -->|否| L[输出错误信息]
    L --> M[终止GLFW]
    M --> N[返回-1]
    K -->|是| O[创建VAO和VBO]
    O --> P[绑定VAO和VBO]
    P --> Q[定义两个三角形顶点数据]
    Q --> R[将顶点数据载入VBO]
    R --> S[创建顶点着色器]
    S --> T[编译顶点着色器]
    T --> U{编译成功?}
    U -->|否| V[获取并输出错误日志]
    V --> W[清理资源]
    W --> X[返回-1]
    U -->|是| Y[创建片段着色器]
    Y --> Z[编译片段着色器]
    Z --> AA{编译成功?}
    AA -->|否| AB[获取并输出错误日志]
    AB --> AC[清理资源]
    AC --> AD[返回-1]
    AA -->|是| AE[创建着色器程序]
    AE --> AF[附加着色器到程序]
    AF --> AG[链接着色器程序]
    AG --> AH{链接成功?}
    AH -->|否| AI[获取并输出错误日志]
    AI --> AJ[清理资源]
    AJ --> AK[返回-1]
    AH -->|是| AL[删除着色器对象]
    AL --> AM[激活着色器程序]
    AM --> AN[设置顶点属性指针]
    AN --> AO[启用顶点属性]
    AO --> AP[注册回调函数]
    AP --> AQ[进入渲染循环]
    AQ --> AR{窗口应关闭?}
    AR -->|是| AS[清理资源]
    AR -->|否| AT[处理输入]
    AT --> AU[设置清除颜色]
    AU --> AV[清除颜色缓冲]
    AV --> AW[使用着色器程序]
    AW --> AX[绑定VAO]
    AX --> AY[绘制两个三角形]
    AY --> AZ[交换缓冲区]
    AZ --> BA[轮询事件]
    BA --> AQ
    AS --> BB[终止GLFW]
    BB --> BC[程序结束]
    X --> BB
    AD --> BB
    AK --> BB